﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using BUS;
using Entity;
using Share;
using DevExpress.XtraGrid.Localization;
using System.Threading;
using Utilities;
using System.Collections;

namespace SLMNG
{
    public partial class CA_Foods : BaseForm
    {
        #region Form Event

        public CA_Foods()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            StatusOfForm = FormStatus.Add;
            seCost.Properties.DisplayFormat.FormatString = Global.NumberFormat.DecimalWithNull;
            seCost.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom;
            seCost.Properties.Mask.EditMask = Global.NumberFormat.Decimal;
            gridView1.Columns["Cost"].DisplayFormat.FormatString = Global.CurrencyFormat;
            gridView1.Columns["Cost"].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom;

            bw.DoWork += bw_DoWork;
            bw.RunWorkerCompleted += bw_RunWorkerCompleted;
        }

        void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                GridLocalizer.Active = new MyGridLocalizer();
                LoadData();
            }
            catch (Exception ex)
            {
                MessageBox.Show(HandleException.HandleSQLException(ex.Message), this.Text);
            }
        }

        #endregion

        #region Add to BackgroundWorker

        public void bwGridLoadTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    bw.RunWorkerAsync(Tasks.GRID_LOAD); // Thêm một process vào bw với tham số FORM_LOAD
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwAddNewItemTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    if (Permission.CanAdd)
                    {
                        bw.RunWorkerAsync(Tasks.ITEM_ADDNEW);
                    }
                    else
                    {
                        ErpMessageBoxEX.Show(Messages.USER_RIGHT_CANNOT_ADD, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.fncRefresh();
                    }
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwUpdateItemTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    if (Permission.CanEdit)
                    {
                        bw.RunWorkerAsync(Tasks.ITEM_UPDATE);
                    }
                    else
                    {
                        ErpMessageBoxEX.Show(Messages.USER_RIGHT_CANNOT_EDIT, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.fncRefresh();
                    }
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwLoadItemTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    bw.RunWorkerAsync(Tasks.ITEM_LOAD);
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwDeleteItemTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    if (Permission.CanDelete)
                    {
                        bw.RunWorkerAsync(Tasks.ITEM_DELETE);
                    }
                    else
                    {
                        ErpMessageBoxEX.Show(Messages.USER_RIGHT_CANNOT_DEL, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        this.fncRefresh();
                    }
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwLoadComboBoxTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    bw.RunWorkerAsync(Tasks.COMBOBOX_LOAD);
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        public void bwLoadOtherTask()
        {
            try
            {
                while (bw.IsBusy == true)
                {
                    Application.DoEvents(); // Nếu ứng dụng mình còn process nào đang chạy, thì vẫn tiếp tục chạy đồng thời thực hiện thêm tác vụ tiếp theo
                    System.Threading.Thread.Sleep(Globals.DEFAULT_SLEEPTIME); // Nhưng 1 khoảng thời gian nhằm mục đích focus đến process đang chạy, rồi mới thực hiện process dưới
                }
                lock (this)
                {
                    bw.RunWorkerAsync(Tasks.OTHERS);
                }
            }
            catch (Exception ex)
            {
                Erp_ExceptionHandler(ex);
            }
        }

        #endregion

        #region Background Worker

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            ArrayList arr_Argument_Of_bw = new ArrayList();
            arr_Argument_Of_bw.Add(e.Argument);
            try
            {
                switch ((Tasks)e.Argument)
                {
                    case Tasks.COMBOBOX_LOAD:
                        {
                            #region Combobox Load

                           

                            #endregion
                            break;
                        }
                    case Tasks.GRID_LOAD:
                        {
                            #region Grid Load

                            base.StatusText = Messages.STATUS_LOADING;
                            

                            #endregion
                            break;
                        }
                    case Tasks.ITEM_ADDNEW:
                        {
                            #region Item Addnew

                            base.StatusText = Messages.STATUS_INSERT;


                            #endregion
                            break;
                        }
                    case Tasks.ITEM_UPDATE:
                        {
                            #region Item Update

                            base.StatusText = Messages.STATUS_UPDATE;


                            #endregion
                            break;
                        }
                    case Tasks.ITEM_LOAD:
                        {
                            #region Item Load


                            #endregion
                            break;
                        }
                    case Tasks.ITEM_DELETE:
                        {
                            #region Item Delete


                            #endregion
                            break;
                        }

                    case Tasks.OTHERS:
                        {
                            #region Others

                            base.StatusText = Messages.STATUS_UPDATE;

                            Thread.Sleep(2000);

                            string rs = "0";

                            arr_Argument_Of_bw.Add(rs);

                            #endregion
                            break;
                        }

                    default:
                        {
                            break;
                        }
                }
            }
            catch (Exception ex)
            {
                arr_Argument_Of_bw.Add(ex);
            }
            finally
            {
                e.Result = arr_Argument_Of_bw;
            }
        }  

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == false)
            {
                ArrayList arr_Argument_Of_bw = (ArrayList)e.Result;
                try
                {
                    if (!e.Cancelled)
                    {
                        switch ((Tasks)arr_Argument_Of_bw[0])
                        {
                            case Tasks.COMBOBOX_LOAD:
                                {

                                    break;
                                }

                            case Tasks.GRID_LOAD:
                                {
                                    #region GRID_LOAD

                                    base.StatusText = Messages.STATUS_LOADING_COMPLETE;
                                    #endregion
                                    break;
                                }

                            case Tasks.ITEM_ADDNEW:
                                {
                                    #region Item AddNew


                                    #endregion
                                    break;
                                }
                            case Tasks.ITEM_UPDATE:
                                {
                                    #region Item Update


                                    #endregion
                                    break;
                                }
                            case Tasks.ITEM_LOAD:
                                {
                                    #region Item Load

                                    #endregion
                                    break;
                                }
                            case Tasks.ITEM_DELETE:
                                {
                                    #region Item Delete

                                    #endregion
                                    break;
                                }

                            case Tasks.OTHERS:
                                {
                                    #region Others

                                    base.StatusText = Messages.STATUS_UPDATE_COMPLETE;

                                    #endregion
                                    break;
                                }

                            default:
                                {
                                    break;
                                }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Erp_ExceptionHandler(ex);
                }
                finally
                {
                    this.Cursor = Cursors.Default;
                }
            }
        }

        #endregion        

        #region Support Methods

        private void LoadData()
        {
            string[] arg = new string[] { "ItemCode" };
            object[] obj = new object[] { DBNull.Value};
            DataTable dt = CatalogueBase.GetData(ItemFood.STORE_SELECT, arg, obj).Tables[0];
            gridView.DataSource = dt;
        }

        #endregion

        #region Override Methods

        public override void fncInsert()
        {
            tabChildForm.SelectedTabPageIndex = 1;
            ActionOnControl(new Control[] { txtCode }, true);
            StatusOfForm = FormStatus.Add;
            ClearForm();
        }

        public override void fncSave()
        {
            if (tabChildForm.SelectedTabPageIndex == 1)
            {
                if (string.IsNullOrEmpty(txtCode.Text))
                {
                    MessageBox.Show(temp.ID_IS_NOT_NULL);
                    return;
                }
                else if (string.IsNullOrEmpty(txtName.Text))
                {
                    MessageBox.Show(temp.NAME_IS_NOT_NULL);
                    return;
                }

                string[] arg = new string[] { "ItemCode", "ItemName", "Cost" };
                object[] obj = new object[] { txtCode.Text.Trim(), txtName.Text.Trim(), seCost.EditValue };
                string result = string.Empty;
                if (StatusOfForm == FormStatus.Add)
                    result = CatalogueBase.SaveData(ItemFood.STORE_INSERT, arg, obj);
                else if (StatusOfForm == FormStatus.Edit)
                    result = CatalogueBase.SaveData(ItemFood.STORE_UPDATE, arg, obj);

                if (result == "0")
                {
                    if (StatusOfForm == FormStatus.Add)
                    {
                        ClearForm();
                        MessageBox.Show(temp.STATUS_INSERT_SUCCESS, this.Text);
                    }
                    else
                        MessageBox.Show(temp.STATUS_UPDATE_SUCCESS, this.Text);
                }
                else
                    MessageBox.Show(HandleException.HandleSQLException(result), this.Text);

            }
        }

        private void ClearForm()
        {
            txtCode.Text = string.Empty;
            txtName.Text = string.Empty;
            txtCode.Focus();
        }

        public override void fncEdit()
        {
            if (gridView1.FocusedRowHandle >= 0)
            {
                tabChildForm.SelectedTabPageIndex = 1;
                ActionOnControl(new Control[] { txtCode }, false);
                StatusOfForm = FormStatus.Edit;

                string[] arg = new string[] { "ItemCode" };
                object[] obj = new object[] { gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "ItemCode").ToString(), DBNull.Value };
                DataTable dt = CatalogueBase.GetData(ItemFood.STORE_SELECT, arg, obj).Tables[0];
                txtCode.Text = dt.Rows[0]["ItemCode"].ToString();
                txtName.Text = dt.Rows[0]["ItemName"].ToString();
                seCost.EditValue = dt.Rows[0]["Cost"];
            }
        }

        public override void fncDelete()
        {
            if (gridView1.FocusedRowHandle >= 0)
            {
                MessageBox.Show(gridView1.GetRowCellValue(gridView1.FocusedRowHandle, "ZoneCode").ToString());
            }
        }

        public override void fncRefresh()
        {
            bwLoadOtherTask();
            //ErpMessageBoxEX.Show("Chay duoc roi ne", this.Text, EnumMessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
        }

        #endregion

    }
}
